.TH std::codecvt::out,do_out 3 "2024.06.10" "http://cppreference.com" "C++ Standard Libary"
.SH NAME
std::codecvt::out,do_out \- std::codecvt::out,do_out

.SH Synopsis
   Defined in header <locale>
   public:

   result out( StateT& state,
               const InternT* from,
               const InternT* from_end,              \fB(1)\fP
               const InternT*& from_next,
               ExternT* to,
               ExternT* to_end,

               ExternT*& to_next ) const;
   protected:

   virtual result do_out( StateT& state,
                          const InternT* from,
                          const InternT* from_end,   \fB(2)\fP
                          const InternT*& from_next,
                          ExternT* to,
                          ExternT* to_end,

                          ExternT*& to_next ) const;

   1) Public member function, calls the member function do_out of the most derived
   class.
   2) If this codecvt facet defines a conversion, translates the internal characters
   from the source range [from, from_end) to external characters, placing the results
   in the subsequent locations starting at to. Converts no more than from_end - from
   internal characters and writes no more than to_end - to external characters. Leaves
   from_next and to_next pointing one beyond the last element successfully converted.

   If this codecvt facet does not define a conversion, no characters are converted.
   to_next is set to be equal to to, state is unchanged, and std::codecvt_base::noconv
   is returned.

   do_out(state, from, from + 1, from_next, to, to_end, to_next) must return ok if

     * this codecvt facet is used by basic_filebuf, and
     * do_out(state, from, from_end, from_next, to, to_end, to_next) would return ok
       where from != from_end.

.SH Return value

   A value of type std::codecvt_base::result, indicating the success status as follows:

   ok      conversion completed
   partial not enough space in the output buffer or unexpected end of source buffer
   error   encountered a character that could not be converted
   noconv  this facet is non-converting, no output written

   The non-converting specialization std::codecvt<char, char, std::mbstate_t> always
   returns std::codecvt_base::noconv.

.SH Notes

   Requires that from <= from_end && to <= to_end and that state either representing
   the initial shift state or obtained by converting the preceding characters in the
   sequence.

   While codecvt supports N:M conversions (e.g. UTF-16 to UTF-8, where two internal
   characters may be necessary to decide what external characters to output),
   std::basic_filebuf can only use codecvt facets that define a 1:N conversion, that is
   it must be able to process one internal character at a time when writing to a file.

   When performing N:M conversions, this function may return std::codecvt_base::partial
   after consuming all source characters (from_next == from_end). This means that
   another internal character is needed to complete the conversion (e.g. when
   converting UTF-16 to UTF-8, if the last character in the source buffer is a high
   surrogate).

   The effect on state is deliberately unspecified. In standard facets, it is used to
   maintain shift state like when calling std::wcsrtombs, and is therefore updated to
   reflect the shift state after the last successfully converted character, but a
   user-defined facet is free to use it to maintain any other state, e.g. count the
   number of special characters encountered.

.SH Example


// Run this code

 #include <iostream>
 #include <locale>
 #include <string>

 int main()
 {
     std::locale::global(std::locale("en_US.utf8"));
     auto& f = std::use_facet<std::codecvt<wchar_t, char, std::mbstate_t>>(std::locale());
     std::wstring internal = L"z\\u00df\\u6c34\\U0001f34c"; // L"zß水🍌"

     // note that the following can be done with wstring_convert
     std::mbstate_t mb{}; // initial shift state
     std::string external(internal.size() * f.max_length(), '\\0');
     const wchar_t* from_next;
     char* to_next;
     f.out(mb, &internal[0], &internal[internal.size()], from_next,
               &external[0], &external[external.size()], to_next);
     // error checking skipped for brevity
     external.resize(to_next - &external[0]);

     std::cout << "The string in narrow multibyte encoding: " << external << '\\n';
 }

.SH Output:

 The string in narrow multibyte encoding: zß水🍌

   Defect reports

   The following behavior-changing defect reports were applied retroactively to
   previously published C++ standards.

     DR   Applied to            Behavior as published               Correct behavior
                     it was unclear whether the conversion is
   LWG 76 C++98      required                                     only required if used
                     to support taking one internal character at  by basic_filebuf
                     a time

.SH See also

   overflow  writes characters to the associated file from the put area
   \fB[virtual]\fP \fI(virtual protected member function of std::basic_filebuf<CharT,Traits>)\fP

             converts a wide string into a byte string
   to_bytes  \fI\fI(public member\fP function of\fP
             std::wstring_convert<Codecvt,Elem,Wide_alloc,Byte_alloc>)
   wcsrtombs converts a wide string to narrow multibyte character string, given state
             \fI(function)\fP
   do_in     converts a string from ExternT to InternT, such as when reading from file
   \fB[virtual]\fP \fI(virtual protected member function)\fP
